#ifndef BOOK_H
#define BOOK_H

#include <QMainWindow>
#include <QMainWindow>
#include <QUrl>
#include <QQueue>
#include <QList>
#include<QStringList>
#include <QNetworkAccessManager>
#include<QNetworkReply>
#include<QNetworkRequest>
#include <QFileDialog>
#include<QStandardItemModel>
#include<QStringListModel>//存储简单的string列表
#include<alibabacloud\oss\OssClient.h>
#include <iostream>
namespace Ui {
class Book;
}
using namespace AlibabaCloud::OSS;
class Book : public QMainWindow
{
    Q_OBJECT

public:
    explicit Book(QWidget *parent = nullptr);
    ~Book();
public:
    //这是函数
    //分成100个块下载
    void downLoadAction(const QUrl url);

    //客户端发送请求，请求中为文件服务器的文件路径，接收参数为所有的文件名，文件名用一个可变的容器存储

    void fileListShow();
    //槽函数


public:
    //这是槽函数
    void on_searchbtn_clicked();

    void filepathbtn_clicked();

    void on_updatebtn_clicked();

    void urlbtn_clicked();

    void on_pausebtn_clicked();

    void on_downloadbtn_clicked();
    //void ProgressCallback(size_t increment, int64_t transfered, int64_t total, void* userData);
    void changeProgressValue(int64_t value, int64_t filesize);

public :
    //成员变量
    int progressvalue = 0;
    QString filepath;//下载文件要存储的路径，只有一个
    QString filename;
    int64_t filesize=0;
    QStringList filenames;//许多个文件名
    QStandardItemModel* model;
    //全局唯一一个网络管理manager
    QNetworkAccessManager * manager;
    int64_t currentoffset=0;
    int64_t totaloffset = 0;
    //const qint64 blocksize=1024*1024;//默认块大小为1MB
    QQueue<QPair<qint64,qint64>> requestqueue;
    //下载暂停的槽函数
    void on_downLoadPause();
    //一个bool型的flag判断是否暂停,默认是不暂停，继续下载的
    bool downloadstatus=true;


public:
    //这是用于连接服务器的一些可用字段
    std::string DownloadFilePath = "D:\\localpath\\VirtualBox-7.0.18-162988-Win.exe";
    /* 设置断点记录文件所在的目录，并确保指定的目录已存在，例如D:\\localpath。*/
    /* 只有当Object下载中断产生了断点记录文件后，如果需要继续下载该Object，才需要设置对应的断点记录文件。下载完成后，该文件会被删除。*/
    std::string CheckpointFilePath = "D:\\localpath";
    std::string Endpoint;
    std::string BucketName;
    std::string Region;
    ClientConfiguration conf;

signals:
    //这是一个文件下载暂停的信w号
    void downLoadPause();

private:
    Ui::Book *ui;
};

#endif // BOOK_H
